模块化无模块化标准阶段早在模块化标准还没有诞生的时候,前端领域已经产生了一些模块化的开发手段,如文件划分、命名空间和 IIFE 私有作用域。
(1)文件划分:
文件划分方式是最原始的模块化实现,简单来说就是将应用的状态和逻辑分散到不同的文件中,然后通过 HTML 中的 script 来一一引入。
问题:
模块的变量相当于全局声明和定义,会出现命名冲突的问题
由于变量都在全局定义,我们很难知道某个变量到底属于哪个模块,造成了调试困难
无法清晰的管理模块之间的依赖关系和加载顺序,加载顺序只能通过手动调整script标签的位置实现。
(2)命名空间:
命名空间是模块化的另一种实现手段,它可以解决上述文件划分方式中全局变量定义所带来的一系列问题。通过将每个模块的生命周期指定一个所属的命名空间,达到解决变量污染的问题,具体的实现是在每个模块包裹上windown.命名空间
(3)IIFE(立即执行函数):
相比于命名空间的模块化手段,IIFE实现的模块化安全性要更高,对于模块作用域的区分更加彻底。
我们知道,每个IIFE 即立即执行函数都会创建一个私有的作用域,在私有作用域中...
《Vue的设计与实现》——霍春阳响应系统作用与实现1234567891011121314151617181920212223const targetMap = new WeakMap();const obj = new Proxy(data, { // 监听读取操作 get(target, key) { track(target, key); return targer[key]; }; set(target, key, newVal) { target[key] = newVal; triger(targer, key); }})function track(target, key) {}function triger(target, key) {}
a. 分支切换导致的副作用冗余问题
cleanup函数
b. 遍历set时导致的无限循环问题
创建一个新的Set数据结构
c. 嵌套副作用函数导致响应式关...
硬件结构图灵机
纸带 -> 内存
读写头
控制单元
存储单元
运算单元
冯诺依曼模型
运算器
存储器
控制器
输入设备
输出设备
内存中央处理器CPU 内部还有一些组件,常见的有寄存器、控制单元和逻辑运算单元
常用的寄存器种类有:
1. 通用寄存器
1. 指令寄存器
1. 程序计数器
通用寄存器,用来存放需要进行运算的数据;
指令寄存器用来存放当前正在执行以及执行完的指令;
程序计数器用来存放下一条需要执行的指令的地址;
事件总线总线是用于 CPU 和内存以及其他设备之间的通信,总线可分为 3 种:
地址总线
数据总线
控制总线
地址总线,用于指定 CPU 将要操作的内存地址;
数据总线,用于读写内存的数据;
控制总线,用于发送和接收信号,比如中断、设备复位等信号
中断在计算机中,中断是系统用来响应硬件设备请求的一种机制,操作系统收到硬件的中断请求,会打断正在执行的进程,然后调用内核中的中断处理程序来响应请求。
操作系统收到了中断请求,会打断其他进程的运行,所以 中断请求的响应程序 也就是中断处理程序,要尽可能快的执行完,这样可以减少对正常进程运行调度地影响...
Axios二次封装Axios是什么?定义
Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。
特性
从浏览器创建 XMLHttpRequests
从 node.js 创建 http 请求
支持 Promise API
拦截请求和响应
转换请求和响应数据
取消请求
超时处理
查询参数序列化支持嵌套项处理
自动将请求体序列化为:
JSON (application/json)
Multipart / FormData (multipart/form-data)
URL encoded form (application/x-www-form-urlencoded)
将 HTML Form 转换成 JSON 进行请求
自动转换JSON数据
获取浏览器和 node.js 的请求进度,并提供额外的信息(速度、剩余时间)
为 node.js ...
国际化方案国际化背景 国际化(Internationalization,简称 i18n)是指在软件、网站或应用开发中,使其能够适应不同国家或地区的语言、文化、时间格式、货币符号、法律规范等多样化需求的过程。通过国际化,产品可以更容易地进行本地化(Localization),即根据特定地区的需求进行适应和调整,而无需重新开发整个系统。
国际化的核心目标是设计和构建一个产品,使其能够支持多语言、多地区的使用,并且能够灵活处理各种与地域相关的差异,如文本翻译、日期格式、货币、单位、输入法等。
扩展:
本地化:本地化(Localization, L10n)的核心是将产品适配特定地区的语言、文化、习俗和法律要求,以便为目标市场提供符合当地用户期望的体验。
国际化需要解决的问题
语言翻译
静态文案(前端静态模板文案)
动态文案(服务端下发的动态数据)
样式
不同的语言文案,长度不一样,容易造成样式混乱
图片替换(带有文案的图片)
受文化习惯的影响,部分地区使用从右到左的阅读方式
文化习惯
货币单位
时间格式
准确的文字翻译,受文化风俗的影响,相同的文字可能蕴...
构建DOM树什么是Dom
从页面的视角来看,DOM 是生成页面的基础数据结构。
从 JavaScript 脚本视角来看,DOM 提供给 JavaScript 脚本操作的接口,通过这套接口,JavaScript 可以对 DOM 结构进行访问,从而改变文档的结构、样式和内容。
从安全视角来看,DOM 是一道安全防护线,一些不安全的内容在 DOM 解析阶段就被拒之门外了
渲染引擎还有一个安全检查模块叫 XSSAuditor,是用来检测词法安全的。在分词器解析出来 Token 之后,它会检测这些模块是否安全,比如是否引用了外部脚本,是否符合 CSP 规范,是否存在跨站点请求等。如果出现不符合规范的内容,XSSAuditor 会对该脚本或者下载任务进行拦截。详细内容我们会在后面的安全模块介绍,这里就不赘述了
Dom树如何生成在渲染引擎内部,有一个叫HTML 解析器(HTMLParser)的模块,它的职责就是负责将 HTML 字节流转换为 DOM 结构。
详细流程
浏览器判断响应头中的 content-type 字段
创建渲染进程,网络进程和渲染进程之间会建立一个共享数据的管道
渲染进...
浏览器缓存——强缓存和协商缓存为了减轻服务器的压力,http提供了一个叫做缓存的解决方案。当数据没有发生变化时,浏览器每次都从缓存中读取数据,但是这样有个问题就是浏览器怎么知道服务器何时更新了资源。于是我们把缓存添加了一个有效时间,只要缓存过期,浏览器就会重新向服务端发起请求,这个缓存有效的时间主要由服务端设置。
强缓存(本地缓存)概念不需要跟服务器进行通信,直接使用本地缓存的资源
相关的header字段
**expires**: 缓存过期时间, 一个未来时间,代表资源何时无效
缺点: 这种方法有个弊端就是当服务器时间和浏览器端的时间不同步时,就会导致一些错误,于是出现了下面的改进方法:
**cache-control(http1.1)**:
这种方法采用相对时间的方式,有效时间从浏览器端收到响应结果开始生效
max-age:代表在这个请求正确返回的时间的一段时间内再次加载资源,就会命中强缓存。
no-cache:不使用本地缓存,向浏览器发送新鲜度校验请求
no-store:禁止缓存浏览器数据,也禁止保存至临时文件中,每次都重新请求
public:任何情况下都缓存(即使是...
HTTPSHTTPS 在HTTP的基础上多了一层TLS协议的建立
TLS四次握手(非对称加密过程)客户端发给服务端
客户端随机数
支持的协议,如TLS1.2
支持的加密算法,如RSA
服务端发给客户端
服务端随机数
接下来加密用的协议和加密算法
CA证书
客户端发给服务端
取出CA证书中的服务器公钥
生成pre_master_key, 用公钥加密然后发给服务器
将三个随机数:客户端随机数、服务端随机数、pre_master_key 计算得出一个会话密钥
将迄今为止的通信数据生成一个摘要,也叫finish报文,用会话密钥加密后传给服务端做校验
服务端发给客户端
服务端使用服务端私钥解密,得到pre_master_key, 集齐三个随机数
将三个随机数:客户端随机数、服务端随机数、pre_master_key 计算得出一个会话密钥
将迄今为止的通信数据生成一个摘要,也叫finish报文,用会话密钥加密后传给客户端做校验
后续就一直使用会话密钥进行对称加密了
问题:
为什么不直接传公钥,而是使用CA证书加密后的公钥
为什么是三个随机数,而不是一个或者两个
http发...